import jwt, datetime
from django.conf import settings



class AuthJWT:
    ''' token的生成和解析 '''
    key = settings.SECRET_KEY                       # 密钥，用于签名验证
    expiration_time = settings.EXPIRATION_TIME      # token过期时间
    @classmethod
    def generate(cls, data: dict, expiration_time:int=None) -> str:
        """
        生成 token 并返回
        :param data: 要保存在 token 中的数据，类型为 dict
        :param expiration_time: token 的有效期，单位为秒
        :return: 生成的 token
        """
        # 设置 token 的过期时间
        expiration_time = expiration_time if expiration_time else cls.expiration_time
        expiration = datetime.datetime.utcnow() + datetime.timedelta(seconds=expiration_time)
        # 构造 token 的 payload 部分，包含要保存的数据和过期时间
        payload = {'data': data, 'exp': expiration}
        # 生成 token，并使用指定的密钥进行签名
        token = jwt.encode(payload, cls.key, algorithm='HS256')
        return token

    @classmethod
    def decode(cls, token:str) -> dict:
        """
        解析 token 并返回其中的数据
        :param token: 要解析的 token
        :return: 解析出的数据，类型为 dict
        """
        try:
            # 解码 token，并使用指定的密钥进行签名验证
            payload = jwt.decode(token, cls.key, algorithms=['HS256'])
            # 获取 token 中保存的数据部分
            data = payload.get('data', {})
            return data
        except jwt.ExpiredSignatureError:
            print('Token 已经过期')
            return None
        except jwt.InvalidTokenError:
            print('无效的 Token')
            return None
